/**
 * 
 */
package br.gov.sjc.export;
 
import java.io.IOException;
import java.net.SocketException;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import br.gov.sjc.ftp.ClasseFTP;
import br.gov.sjc.socialalimenta.R;
import br.gov.sjc.socialalimenta.SocialAlimenta2Activity;
import br.gov.sjc.xml.XMLReadWrite;
import br.org.sjc.validacao.DestroiDatabase;
import br.org.sjc.validacao.Sair;

/**
 * @author rodrigo.ramos
 *
 */
public class SincronizarDados extends Sair {
	//Declara base de dados
	private static String TAG = "SincronizarDados";
	public static SQLiteDatabase BancoDados = null;
	private static String nomeBanco = "SocialAlimenta";
	//private String NomeArquivo = "socialAlimenta";
	private static Handler handler;
	private Thread downloadThread;
	// Static so that the thread access the latest attribute
	private static ProgressDialog dialog;
	private String RESPOSTA = "";
		
	
	private static int erro = 0; 
	public void openDB(){
		try{
			BancoDados = openOrCreateDatabase(nomeBanco,MODE_WORLD_READABLE,null);
			Log.v(TAG, "BancoDados.openOrCreateDatabase();");
		}catch (Exception E){
			Log.e(TAG, "Erro em BancoDados.close();"+E.getMessage());
		} 
	}
	public void closeDB(){
		BancoDados.close();
		Log.v(TAG, "BancoDados.close();");
	}
	
	Button btnEVoltar, btnDenovo;
	ProgressBar pbExportando;
	TextView lblResposta, lblRespostaErro;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.export);
		registerBaseActivityReceiver();
		
		// Create a handler to update the UI
		handler = new Handler();

		// Check if the thread is already running
		downloadThread = (Thread) getLastNonConfigurationInstance();
		if (downloadThread != null && downloadThread.isAlive()) {
			dialog = ProgressDialog.show(this, "Download", "downloading");
		}
		
		pbExportando = (ProgressBar) findViewById(R.export.pbExportando);
		lblResposta = (TextView) findViewById(R.export.lblResposta);   
		lblRespostaErro = (TextView) findViewById(R.export.lblRespostaErro);   
		openDB();
		
		/** Acao do botao Voltar Em Erros*/
		btnEVoltar = (Button) findViewById(R.export.btnVoltar);
		btnEVoltar.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				VoltarBTN();
				closeDB();
			}
		});//fim acao do botao voltar
		
		/** Acao do botao Diiinoovo*/
		btnDenovo = (Button) findViewById(R.export.btnDenovo);
		btnDenovo.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				lblResposta.setText("");
				lblRespostaErro.setText("");
				RESPOSTA = "";
				if (erro>0){
					erro=0;
					Sincronizar();
				}else{
					RESPOSTA += "Já Sincronizado Anteriormente Sem Erros";
					lblResposta.setText(RESPOSTA);
				}
			}
		});//fim acao do botao Diiinoovo
		
		Sincronizar();
	}
	// Save the thread
	@Override
	public Object onRetainNonConfigurationInstance() {
		return downloadThread;
	}
	public class MyThread extends Thread {
		@Override
		public void run() {
		if (TemConexao()){
			if (erro==0){
				try{
					baixarArquivo();
					//lblResposta.setText(RESPOSTA);
				}catch(SocketException se){
					Log.e(TAG, "onCreate - ERRO SocketException:"+se.getMessage());
				}catch(IOException ioe){
					Log.e(TAG, "onCreate - ERRO IOException:"+ioe.getMessage());
				}
				
			}
			if (erro==0){
				try {
					XML();
					//lblResposta.setText(RESPOSTA);
				} catch (Exception e) {
					Log.e(TAG, "onCreate - ERRO Exception:"+e.getMessage());
				}
			}
			if (erro==0){
				try {
					sobeNovoArquivo();
					
					//lblResposta.setText(RESPOSTA);
				} catch (Exception e) {
					Log.e(TAG, "onCreate - ERRO Exception:"+e.getMessage());
				}
			} 
			if (erro==0){
				try {
					DestroiDB();
					//lblResposta.setText(RESPOSTA);
				} catch (Exception e) {
					Log.e(TAG, "onCreate - ERRO Exception:"+e.getMessage());
				}
			}
			if (erro==0){
				try {
					
					leXML();
				} catch (Exception e) {
					Log.e(TAG, "onCreate - ERRO Exception:"+e.getMessage());
				}
			}
		}else {
			//mensagemAlerta("Erro de Rede", "Rede Não encontrada");
			RESPOSTA += " Rede Não encontrada ";
			
		}
		handler.post(new MyRunnable());
		}
	}
	
	public void Sincronizar() {
		dialog = ProgressDialog.show(this, "Sincronizar", "Sincronizando, aguarde...");
		downloadThread = new MyThread();
		downloadThread.start();
	}
	
	protected void VoltarBTN() {
		/** InitComponents */
		Intent ittEVoltar = new Intent(getApplicationContext(), SocialAlimenta2Activity.class);
		closeDB();
		startActivity(ittEVoltar);
		erro = 0;
	}

	private boolean TemConexao() {
		boolean lblnRet = false;
		try
		{
			ConnectivityManager cm = (ConnectivityManager)
					getSystemService(Context.CONNECTIVITY_SERVICE);
			if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isAvailable() && cm.getActiveNetworkInfo().isConnected()) {
				lblnRet = true;
			} else {
				lblnRet = false;
			}
		}catch (Exception e) {
			Log.e(TAG, "TemConexao - Erro: "+e.getMessage());
		}
		return lblnRet;
	}

	private void baixarArquivo() throws SocketException, IOException{
		// colocar o arquivo no FILE
		
		ClasseFTP dftp = new ClasseFTP();
		if (dftp.downloadFTP(
				"/data/data/br.gov.sjc.socialalimenta/files/",
				nomeArquivo()+"d.xml")){
			RESPOSTA += " 1-Baixou o Arquivo Corretamente ";
			Log.i(TAG, "baixarArquivo - Nome do arquivo:"+nomeArquivo()+"d.xml");
		}else{
			Log.e(TAG, "baixarArquivo - ERRO: Não Baixou o Arquivo");
			RESPOSTA += " Não Baixou o Arquivo  ";
			//mensagemAlerta("Erro","Não baixou o arquivo corretamente");
			erro++;
		}
	}

	/*
	 * Load file content to String
	 */
	private void XML() throws Exception{
		/**
		 * Excrever o XML
		 */
		try
		{
			XMLReadWrite mt = new XMLReadWrite(this);
			mt.LeEGrava(nomeArquivo()+"u.xml");
			RESPOSTA += " 2-Gerou XML Corretamente  ";
		}catch(Exception e){
			Log.e(TAG, "XML() - ERRO - "+e.getMessage());
			RESPOSTA += " Não Gerou o Arquivo  ";
			//mensagemAlerta("Erro","Ocorreu um erro ao escrever o XML - "+e.getMessage());
			erro++;
		}

	}

	private void DestroiDB() {
		try{
			DestroiDatabase dp = new DestroiDatabase(this);
			Log.i(TAG,"DestroiDatabase="+dp.toString());
			RESPOSTA += " 3-Limpou a Base Corretamente  ";
		}catch(Exception e){
			Log.e(TAG, "DestroiDB() - ERRO - "+e.getMessage());
			RESPOSTA += " Não Limpou a Base de Dados  ";
			//mensagemAlerta("Erro","Ocorreu um erro ao escrever o XML - "+e.getMessage());
			erro++;
		}
	}

	private void leXML() {
		try{
			/**
			 * Ler o próximo XML
			 */

			Log.v(TAG, "leXML - lerXml");
			XMLReadWrite mtLeitura = new XMLReadWrite(this);
			mtLeitura.lerXml(nomeArquivo());//Classe Retornando Nada
			Log.v(TAG, "leXML - lerXml - Leu");
			RESPOSTA += " 4-Leu o XML e Gravou dados na Base Corretamente  ";

		}catch(Exception err){
			Log.e(TAG, "leXML - Try lerXml() - ERRO Exception: "+err.getMessage());
			RESPOSTA += " Não Gravou na Base de Dados  ";
			//mensagemAlerta("Erro", "Existem erros com o XML de entrada");
			erro++;
		}		
	}

	private void sobeNovoArquivo() {
		ClasseFTP upload = new ClasseFTP();
		if (upload.uploadFTP(
				"/data/data/br.gov.sjc.socialalimenta/files/", 
				nomeArquivo()+"u.xml")){
			Log.i(TAG, "UpLoad Correto do arquivo:"+nomeArquivo());
			RESPOSTA += " 5-Gravou o Novo arquivo Corretamente  ";
		}else{
			Log.w(TAG, "Erro em "+nomeArquivo());
			RESPOSTA += " Não Gravou o novo arquivo no FTP  ";
			erro++;
		}
	}
	
	@Override
	protected void onResume() {
		//quando a Activity main receber o foco novamente abre-se novamente a conexão
		openDB();
		//método responsável pela atualiza da lista de dados na tela
		//adapter.notifyDataSetChanged();
		super.onResume();
	}
	@Override
	protected void onPause() {

		//toda vez que o programa peder o foco fecha-se a conexão com o BD
		closeDB();
		super.onPause();
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
		unRegisterBaseActivityReceiver();
		finish();
	}
	public class MyRunnable implements Runnable {
		public void run() {
			//imageView.setImageBitmap(downloadBitmap);
			
			if (erro==0){
				lblResposta.setText(RESPOSTA);
			}else{
				lblRespostaErro.setText(RESPOSTA);
			}
			dialog.dismiss();
		}
	}
	private String nomeArquivo(){
		NomeArquivo na = new NomeArquivo(this);
		String NomeArquivo = "socialAlimenta-";
		//TODO: Chamando o ID = 1 (somente deve existir esse ID nessa tabela.)
		NomeArquivo += na.PlacaPatrimonial(1);
		Log.i(TAG, "XML - Nome do arquivo:"+NomeArquivo);
		return NomeArquivo;
	}
}
